﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOH_Factor : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOH_Factor instance = null; 
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.H_FactorDataTable H_factorTabla = new DataSetConsultora.H_FactorDataTable();
        private H_FactorTableAdapter H_factorTableAdapter = new H_FactorTableAdapter();
        // Dependencias de otros DAOs
        private DAOH_Pregunta miDAOH_Pregunta = DAOH_Pregunta.Instance;


        public static DAOH_Factor Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOH_Factor();
                        }
                    }
                }
                return instance;
            }
        }

        public void guardar(H_competencia unaH_competencia, int id_cuestionario)
        {

            foreach (H_factor unH_factor in unaH_competencia._factores)
            {
                // Inserto el H_Factor en la db por medio de su table adapter
                H_factorTabla = H_factorTableAdapter.insertar(unH_factor._nombre, unH_factor._descripcion, unaH_competencia._cod_h_competencia);

                // Le seteo el id o codigo con el que fue insertado en la db 
                unH_factor._cod_h_factor = recolectarId();

                // Retorno el H_Factor insertado
                miDAOH_Pregunta.guardar(unH_factor, id_cuestionario);
            }
        }

        public H_factor guardar(H_factor unH_factor, int id_H_competencia){

            // Inserto el H_Factor en la db por medio de su table adapter
            H_factorTabla = H_factorTableAdapter.insertar(unH_factor._nombre, unH_factor._descripcion, id_H_competencia);

            // Retorno el H_Factor insertado
            return recolectarUno();
        }

        public void actualizar(H_factor unH_factor){

            // Actualizo la Respuesta en la db pro medio de su table adapter
            H_factorTableAdapter.Actualizar(unH_factor._nombre, unH_factor._descripcion, unH_factor._cod_h_factor);

        }


        public List<H_factor> cargar()
        {

            // Cargo los H_factor de la db
            H_factorTabla = H_factorTableAdapter.GetData();

            // Finalmente devuelvo la lista de H_factorsCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<H_factor> cargar(Int32 cod_H_competencia)
        {   // obtengo la empresa por id en empresaTabla
            H_factorTabla = H_factorTableAdapter.consultarPor(cod_H_competencia);

            // Finalmente devuelvo la lista de H_factorsCargados, recolectadas por la funcion            
            return recolectar();
        }

        private List<H_factor> recolectar()
        {

            // Creo la lista para recolectar y devolver los H_factors cargadas de la db
            List<H_factor> H_factorsCargados = new List<H_factor>();

            // Recorro los H_factors de la tabla
            foreach (DataSetConsultora.H_FactorRow unaH_factorFila in H_factorTabla)
            {

                // Creo un H_factor y lo agrego a la lista de H_factors cargados
                H_factorsCargados.Add(new H_factor(unaH_factorFila.id,
                                                       unaH_factorFila.Nombre,
                                                       unaH_factorFila.Descripción,                                                       
                                                       miDAOH_Pregunta.cargar(unaH_factorFila.id)
                                                      )
                                        );

            }

            return H_factorsCargados;
        }

        public H_factor recolectarUno()
        {

            // Finalmente retorno un nuevo objeto Empresa mapeado de la tabla
            return new H_factor(H_factorTabla[0].id,
                                H_factorTabla[0].Nombre,
                                H_factorTabla[0].Descripción,
                                miDAOH_Pregunta.cargar(H_factorTabla[0].id)
                                );


        }
        
        private int recolectarId()
        {
            if (H_factorTabla.Count > 0)
            {
                return H_factorTabla[0].id;
            }

            return -1;
        }
    }
}
